
using namespace std;

#include "../IncludesServidor.h"
#include "ConsumidorRespuestas.h"

ConsumidorRespuestas::ConsumidorRespuestas(bool atributo) : Thread(atributo){
	this->conexion 	= NULL;
}

ConsumidorRespuestas::~ConsumidorRespuestas() {
	free(this);
}
//Setters
void ConsumidorRespuestas::setConexion(Socket *conexion){
	this->conexion = conexion;
};
void ConsumidorRespuestas::setJugador1(int socketId){
	this->socketIdJugador1 = socketId;
};
void ConsumidorRespuestas::setJugador2(int socketId){
	this->socketIdJugador2 = socketId;
};


//Manejador de señales de interrupcion.
void ConsumidorRespuestas::signalHandler(int signal){
	//Informo la finalizacion por sysout
	cout<< "[INFO] - Se cierra el hilo de respuesta a clientes. "<< endl;
	//Cierro el thread.
	pthread_exit(NULL);
}

void ConsumidorRespuestas::run (){
	/* Si hay conexion */
	if(this->conexion != NULL){

		/* Me attacho a la señal que envia el server para finalizar. */
		signal(SIGUSR1, ConsumidorRespuestas::signalHandler);

		/* Mientras el cliente este activo */
		while (Partida::getInstance()->isActivo()) {
			/* Desencolo la respuesta generada */
			t_accion acccionADevolver = Partida::getInstance()->desencolarRespuestaJugadores();

			/* La envio a jugador 1*/
			if(Partida::getInstance()->getPartida()->jugador1.conectado )
				if(this->conexion->write(((void *)&acccionADevolver), sizeof(acccionADevolver), this->socketIdJugador1) == -1)
					cout << "[ERROR] - No se pudo enviar una accion al jugador1. " << endl;

			/* La envio a jugador 2*/
			if(Partida::getInstance()->getPartida()->jugador2.conectado )
				if(this->conexion->write(((void *)&acccionADevolver), sizeof(acccionADevolver), this->socketIdJugador2) == -1)
					cout << "[ERROR] - No se pudo enviar una accion al jugador2. " << endl;
		}
	}

	//Cierro el thread.
	pthread_exit(NULL);
}
	
